#版本1，利用递归去对比，效率低，适用性高

import os
import json
from config.logger import log
from json import JSONDecodeError
from config.path import data_path
from collections.abc import Iterable


def json_reader(path1,path2):
    try:
        # 尝试打开并读取两个 JSON 文件
        with open(path1, 'r') as json1, \
                open(path2, 'r') as json2:

            # 尝试加载 JSON 数据
            data1 = json.load(json1)
            data2 = json.load(json2)
            log.debug("两个JSON文件成功读取并解析！")
            return data1,data2

    except FileNotFoundError as fnf_error:
        log.error(f"文件未找到错误: {fnf_error}")
    except JSONDecodeError as json_error:
        log.error(f"JSON解析错误: {json_error}")
    except Exception as e:
        log.error(f"其他错误: {e}")


def json_comparer(data1, data2, level = 1):
    #递归查看整个json文件

    #检查两组数据的层级结构是否一样
    if type(data1) != type(data2):
        log.error(f"出现错误，两个错误的结构不对等，错误出现在{level}层")
        raise

    #处理中间夹带的数组结构
    if type(data1) == list:
        for index in range(len(data1)):
            json_comparer(data1 = data1[index], data2 = data2[index], level =level + 1)

    #正数处理字典结构
    elif type(data1) == dict:
        # 判断键是否全部相等
        key_total_same = 1
        # 判断值是否全部相等
        value_total_same = 1

        #用于记录data2多出的参数
        data2_keys = set(data2.keys())

        for key in data1.keys():
            # 注意，此处是data1包含于data2中，允许data2多参数，不允许data2少参数
            if key in data2.keys():
                #删除data1和data2共有的键
                data2_keys.remove(key)

                # 判断值是否相等，此处只判断叶子层的数据
                if data1[key] != data2[key] and not isinstance(data1[key],Iterable):
                    log.error(f"二者<{key}>键的值出现了不同！")
                    log.warning(f"data1的值为-----------{data1[key]}")
                    log.warning(f"data2的值为-----------{data2[key]}")
                    value_total_same = 0
                json_comparer(data1[key], data2[key], level =level + 1)
            else:
                log.error(f"出现缺少键：data2中缺少键：{key},错误出现在！")
                key_total_same = 0
        # 在处理完 data1 的所有键后，检查 data2 中是否还有多余的键
        if data2_keys:
            log.error(f"data2 中多出的键：{data2_keys}")
        #最底层的数据键值都完全相同时，提示数据完全相同
        if key_total_same == 1 and value_total_same == 1 and not isinstance(data1,Iterable):
            log.info(f"数据的的键与值完全相同完全相同")
    else:
        return

if __name__ == '__main__':
    data1,data2 = json_reader(path1 =os.path.join(data_path, 'input_data.json') ,path2 = os.path.join(data_path, 'ag_photo_generate.json'))
    json_comparer(data1, data2)


